#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>
#include <iostream>
#include <memory>

// 定义server类型，使用websocketpp::config::asio配置
typedef websocketpp::server<websocketpp::config::asio> server_t;

typedef server_t::message_ptr message_ptr;  // 简化message_ptr类型的定义

// 当WebSocket连接建立时调用的回调函数
void onOpen(websocketpp::connection_hdl hdl) {
    std::cout << "WebSocket长连接建立" << std::endl;
}

// 当WebSocket连接关闭时调用的回调函数
void onClose(websocketpp::connection_hdl hdl) {
    std::cout << "WebSocket长连接断开" << std::endl;
}

// 当接收到消息时调用的回调函数
void onMessage(server_t *server, websocketpp::connection_hdl hdl, server_t::message_ptr msg) {
    std::cout << "WebSocket收到消息" << std::endl;  
    std::string body = msg->get_payload();  // 获取收到的消息内容
    std::cout << "收到消息: " << body << std::endl;

    // 进行响应，获取通信连接并发送回消息
    auto conn = server->get_con_from_hdl(hdl);
    conn->send(body + "-Hello", websocketpp::frame::opcode::value::text);  // 回应消息
}

int main() {
    server_t echoserver;

    // 关闭日志输出
    echoserver.set_access_channels(websocketpp::log::alevel::none);

    // 初始化Asio框架
    echoserver.init_asio();

    // 设置连接建立/关闭/消息处理的回调函数
    echoserver.set_open_handler(onOpen);
    echoserver.set_close_handler(onClose);

    // 使用std::bind绑定onMessage函数，并将其设置为消息处理器
    auto ms_handle = std::bind(onMessage, &echoserver, std::placeholders::_1, std::placeholders::_2);
    echoserver.set_message_handler(ms_handle);

    // 设置地址重用
    echoserver.set_reuse_addr(true);

    // 设置监听端口
    echoserver.listen(8088);
    
    //开始监听
    echoserver.start_accept();

    // 启动服务器
    echoserver.run();

    return 0;
}
